#coding:utf-8

class TestClass:
	pass

# 可以动态的修改类型的成员。
TestClass.name = "xxx1"
TestClass.getName = lambda self: self.name

# 可以动态修改对象的成员。
testClass = TestClass()
testClass.name = "xxx2"

print(testClass.__class__)
print(testClass.getName())

# 类型定义
# 实例方法必的第一个参数代表类型实例，类似其他语言的this。
class Animal:
	name = "未知" # 属性定义。

	def __init__(self, name): # 构造方法定义。
		self.name = name

	def getName(self): # 实例方法定义。
		return self.name

	def setName(self, value):
		self.name = value

print(Animal.name) # 未知
print(Animal.__dict__["name"]) # 未知

animal = Animal("狗狗")
print(animal.name) # 狗狗
print(animal.__dict__["name"]) # 狗狗
print(Animal.name) # 未知
print(Animal.__dict__["name"]) # 未知
print(animal.__class__.name) # 未知
print(animal.__class__.__dict__["name"]) # 未知

# 类型定义中的代码会执行，是一个独立的作用域。
class TestClass:
	print("类型定义中") # 类型定义中

# 绑定方法和未绑定方法
class TestClass:
	def method(self):
		print("测试方法")

test = TestClass()
print(TestClass.method) # <unbound method TestClass.method>
print(test.method) # <bound method TestClass.method of <__main__.TestClass object at 0x021B46D0>>

TestClass.method(test) # 测试方法
test.method() # 测试方法

# 私有成员
class TestClass:
	__private_property = 1

	def __private_method():
		pass

print(TestClass.__dict__) # {'__module__': '__main__', '_TestClass__private_method': <function __private_method at 0x0212B970>, '_TestClass__private_property': 1

# 多重继承
class Base1:
	pass

class Base2:
	pass

class Child(Base2, Base1):
	pass

child = Child()
print(isinstance(child, Child)) # True
print(isinstance(child, Base2)) # True
print(isinstance(child, Base1)) # True

# 鸭子类型
class TestClass1:
	def say(self):
		print("我是鸭子1")

class TestClass2:
	def say(self):
		print("我是鸭子2")

def duck_say(duck):
	duck.say()

duck_say(TestClass1()) # 我是鸭子1
duck_say(TestClass2()) # 我是鸭子2

# 调用父类
class Base:
	def say(self):
		print("Base")

class Child(Base):
	def say(self):
		Base.say(self)
		super(Child, self).say()
		print("Child")

child = Child()
child.say()